package com.frejoys.common.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.frejoys.common.constant.CommonConstant;
import com.frejoys.common.enums.ELanguageType;
import com.frejoys.common.enums.EUserWalletLogType;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 通用函数
 */
public class CommonUtil {

    /**
     * object 转 list
     * @param obj   需要转换的List对象
     * @param clazz List中元素的class
     * @param <T>
     * @return
     */
    public static <T> List<T> objectToList(Object obj, Class<T> clazz) {
        List<T> result = new ArrayList<>();
        // 判断 obj 是否包含 List 类型
        if (obj instanceof List<?>) {
            for (Object o : (List<?>) obj) {
                // 使用Class.cast做类型转换
                result.add(clazz.cast(o));
            }
            return result;
        }
        return null;
    }

    /**
     * 去除json错误字符
     * @param s json字符串
     * @return
     */
    public static String replaceErrorJsonCharacter(String s) {
        return StrUtil.replace(StrUtil.replace(StrUtil.strip(s, "\""), "\\\"", "\""), "\\\\", "\\");
    }

    /**
     * 将0,1,2,3字符串转[0,1,2,3] 字符串转list
     * @param splitString
     * @return
     */
    public static List<Integer> strToList(String splitString) {
        return Arrays.stream(splitString.split(",")).map(Integer::parseInt).collect(Collectors.toList());
    }

    /**
     * 获取语言类型
     * @return
     */
    public static Integer getTypeByLanguage() {
        String language = RequestUtil.locale().getLanguage();
        if (language.equals(CommonConstant.languageZh)) {
            return ELanguageType.zh.getValue();
        }

        if (language.equals(CommonConstant.languageEn)) {
            return ELanguageType.en.getValue();
        }

        if (language.equals(CommonConstant.languageKo)) {
            return ELanguageType.ko.getValue();
        }

        return ELanguageType.en.getValue();
    }

    /**
     * 设置
     * @param bit
     * @param offset
     * @return
     */
    public static int bitSetOffset(int bit, int offset) {
        return bit | offset;
    }

    /**
     * 获取
     * @param bit
     * @param offset
     * @return
     */
    public static int bitGetOffset(int bit, int offset) {
        return bit & offset;
    }

    /**
     * 去除
     * @param bit
     * @param offset
     * @return
     */
    public static int bitDelOffset(int bit, int offset) {
        return bit ^ offset;
    }

    /**
     * 存在
     * @param bit
     * @param offset
     * @return
     */
    public static boolean bitExistOffset(int bit, int offset) {
        return (bit & offset) > 0;
    }

    /**
     * 获取需要删除的文件
     * @param oldFile
     * @param newFile
     * @return
     */
    public static List<String> getNeedDelImage(String oldFile, String newFile) {
        if (StrUtil.isEmpty(oldFile)) {
            return new ArrayList<>();
        }

        return CollUtil.subtract(Convert.toList(String.class, oldFile), Convert.toList(String.class, newFile)).stream().toList();
    }

    /**
     * 克转千克
     * @param number
     * @param decimal 小数位数
     * @return
     */
    public static double gToKg(Integer number, Integer decimal) {
        return NumberUtil.round(number.doubleValue() / 1000, decimal, RoundingMode.DOWN).doubleValue();
    }


    /**
     * 设置层级
     *
     * @param path 上级层级
     * @return
     */
    public static String getPath(Integer id,String path) {
        StringBuilder builder = new StringBuilder();
        if (StrUtil.isEmpty(path)) {
            builder.append(0);
        } else {
            builder.append(path);
            builder.append(",");
            //设置层级关系
            if (path.contains(",")) {
                //当前层级+1
                builder.append(id);

            } else {
                //当前层级+1
                builder.append(id);
            }

        }
        return builder.toString();
    }

    /**
     * 转换类型
     * @param i
     * @return
     */
    public static BigDecimal integerToBigDecimal(Integer i) {
        return new BigDecimal(i);
    }

    /**
     * 转换类型
     * @param i
     * @return
     */
    public static BigDecimal floatToBigDecimal(Float i) {
        return new BigDecimal(i);
    }

    /**
     * 转换类型
     * @param i
     * @return
     */
    public static Integer bigDecimalToInteger(BigDecimal i) {
        return i.setScale(0, RoundingMode.DOWN).intValue();
    }

    /**
     * 除以
     * @param a
     * @param b
     * @return
     */
    public static BigDecimal bigDecimalDivide(BigDecimal a, BigDecimal b) {
        return a.divide(b, 8,BigDecimal.ROUND_DOWN);
    }

    /**
     * 除以，2位小数
     * @param a
     * @param b
     * @return
     */
    public static BigDecimal bigDecimalTwoDivide(BigDecimal a, BigDecimal b) {
        return a.divide(b, 2,BigDecimal.ROUND_DOWN);
    }

    /**
     * 乘以
     * @param a
     * @param b
     * @return
     */
    public static BigDecimal bigDecimalMultiply(BigDecimal a, BigDecimal b) {
        return a.multiply(b);
    }

    /**
     * 加法
     * @param a
     * @param b
     * @return
     */
    public static BigDecimal bigDecimalAdd(BigDecimal a, BigDecimal b) {
        return a.add(b);
    }
    public static BigDecimal bigDecimalAdd(BigDecimal... n) {
        BigDecimal num = integerToBigDecimal(0);
        for (BigDecimal b : n) {
            num = num.add(b);
        }
        return num;
    }
    /**
     * 减法
     * @param a
     * @param b
     * @return
     */
    public static BigDecimal bigDecimalSubtract(BigDecimal a, BigDecimal b) {
        return a.subtract(b);
    }

    /**
     * 元转分
     * @param a
     * @return
     */
    public static Integer bigDecimalToFen(BigDecimal a) {
        return a.multiply(integerToBigDecimal(100)).intValue();
    }

    /**
     * 保留2位小数
     * @param a
     * @return
     */
    public static BigDecimal bigDecimalRoundDown(BigDecimal a) {
        return a.setScale(2, BigDecimal.ROUND_DOWN);
    }

    /**
     * 去除多余的0并且转换为字符串
     * @param a
     * @return
     */
    public static String bigDecimalToString(BigDecimal a) {
        return a.stripTrailingZeros().toPlainString();
    }

    /**
     * 获取按照比例计算后的返利金额
     * @param startRatio
     * @param endRatio
     * @param price
     * @return
     */
    public static BigDecimal getRandomRebateMoney(Float startRatio, Float endRatio, BigDecimal price) {
        BigDecimal hundred = CommonUtil.integerToBigDecimal(100);

        // 百分比除以100
        BigDecimal startRatioBigDecimal = CommonUtil.bigDecimalTwoDivide(CommonUtil.floatToBigDecimal(startRatio), hundred);
        BigDecimal endRatioBigDecimal = CommonUtil.bigDecimalTwoDivide(CommonUtil.floatToBigDecimal(endRatio), hundred);

        // 计算起始金额
        BigDecimal startMoney = CommonUtil.bigDecimalMultiply(price, startRatioBigDecimal);
        // 计算结束金额
        BigDecimal endMoney =  CommonUtil.bigDecimalMultiply(price, endRatioBigDecimal);

        // 随机免单金额
        return startMoney.equals(endMoney) ? startMoney : CommonUtil.bigDecimalDivide(CommonUtil.integerToBigDecimal(RandomUtil.randomInt(CommonUtil.bigDecimalMultiply(startMoney, hundred).intValue(), CommonUtil.bigDecimalMultiply(endMoney, hundred).intValue())), hundred);
    }

    // /**
    //  * 元转分
    //  * @param d
    //  * @return
    //  */
    // public static Integer yuanToFen(Double d) {
    //     return (int) (d * 100);
    // }
    //
    // /**
    //  * 分转元
    //  * @param d
    //  * @return
    //  */
    // public static Double fenToYuan(Integer d) {
    //     return Double.valueOf(d) / 100;
    // }
    //
    // /**
    //  * 百分比转换为两位小数
    //  * @param d
    //  * @return
    //  */
    // public static Double ratioToDecimal(Integer d) {
    //     return Double.valueOf(d) / 100;
    // }


    /**
     *  获取第一张图片
     * @param cover 图片
     * @return
     */
    public static String getFirstCover(String cover){
        String[] co = cover.split(",");
        if (co.length > 0) {
            return AppConfigUtil.getUrlPrefix(co[0]);
        }
        return null;
    }


    //拼接钱 + -号
    public static String getMoneyModified(BigDecimal money){
        //价钱大于 0 拼接加号
        if (money.compareTo(BigDecimal.ZERO) == 1){
            String moneys = CommonUtil.bigDecimalToString(money);
            return "+"+moneys;
        } else {
            return CommonUtil.bigDecimalToString(money);
        }
    }

}
